/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bld.model.contato;

import br.com.bld.util.facade.AbstractBe;
import br.com.bld.util.facade.BLDDataErro;
import br.com.bld.util.facade.EntityFactory;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;

/**
 *
 * @author Pedro
 */
public class ContatoBe extends AbstractBe implements BLDDataErro {

    private final ContatoDao dao;

    public ContatoBe() throws SQLException {
        super();

        dao = createDao();
    }

    public ContatoBe(Connection conn) throws SQLException {
        super(conn);

        dao = createDao();
    }

    private ContatoDao createDao() {

        String table = "bldtb06_contato";

        String[] fields = {
            "id",
            "nome",
            "numr_fone",
            "numr_fax",
            "email"
        };

        String[] pk = {"id"};

        String sequece = "bldtb06_contato_id_seq";

        return new ContatoDao(conn, new EntityFactory(conn, table, fields, pk, sequece));
    }

    public int inserir(ContatoEntity entity) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, ContatoEntity.CLASS_ID));
        }

        int resposta = dao.insert(entity, new ContatoPK(proximoId()));

        commit();

        return resposta;
    }

    public ContatoEntity selecionar(ContatoPK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, ContatoPK.CLASS_ID));
        }

        return dao.selectByPk(pk);
    }

    public int atualizar(ContatoEntity entity, ContatoPK pk) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, ContatoEntity.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.update(entity, pk);

        commit();

        return resposta;
    }

    public int apagar(ContatoPK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, ContatoPK.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.delete(pk);

        commit();

        return resposta;
    }

    public HashMap<ContatoPK, ContatoEntity> selecionarTodos() throws SQLException {
        return dao.selectAll();
    }

    public HashMap<ContatoPK, ContatoEntity> selecionarPaginacao(Integer numrPagina, Integer qtdePorPagina) throws SQLException {

        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Número da Página"));
        }
        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Quantidade por Página"));
        }

        return dao.selectByPage(numrPagina, qtdePorPagina);
    }

    private Long proximoId() throws SQLException {
        return dao.nextSequeceValue();
    }
}
